home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / IEFAFP.SA < prev    next >
Text File  |  1989-08-30  |  8KB  |  152 lines

  1.        TTL     IEEE FORMAT EQUIVALENT ASCII TO FLOAT (IEFAFP)
  2. ************************************
  3. * (C) COPYRIGHT 1981 MOTORLA INC.  *
  4. ************************************
  5.  
  6. ***********************************************************
  7. *  IEFAFP  -  CONVERT ASCII TO IEEE FORMAT EQUIVALENT     *
  8. *        IEEE FORMAT EQUIVALENT FAST FLOATING POINT       *
  9. *                                                         *
  10. *      INPUT:  A0 - POINTER TO ASCII STRING OF A FORMAT   *
  11. *                   DESCRIBED BELOW                       *
  12. *                                                         *
  13. *      OUTPUT: D7 - IEEE FORMAT FLOATING POINT EQUIVALENT *
  14. *              A0 - POINTS TO THE CHARACTER WHICH         *
  15. *                   TERMINATED THE SCAN                   *
  16. *                                                         *
  17. *      CONDITION CODES:                                   *
  18. *                N - SET IF RESULT IS NEGATIVE            *
  19. *                Z - SET IF RESULT IS ZERO                *
  20. *                V - SET IF RESULT IS NAN (NOT-A-NUMBER)  *
  21. *                C - SET IF INVALID FORMAT DETECTED       *
  22. *                X - UNDEFINED                            *
  23. *                                                         *
  24. *            ALL REGISTERS ARE PRESERVED                  *
  25. *                                                         *
  26. *          MAXIMUM STACK USED:     48 BYTES               *
  27. *                                                         *
  28. *      INPUT FORMAT:                                      *
  29. *                                                         *
  30. *     {SIGN}{DIGITS}{'.'}{DIGITS}{'E'}{SIGN}{DIGITS}      *
  31. *     <*********MANTISSA********><*****EXPONENT****>      *
  32. *                                                         *
  33. *                        - OR -                           *
  34. *                                                         *
  35. *                  >>  FOR POSITIVE INFINITY              *
  36. *                  <<  FOR NEGATIVE INFINITY              *
  37. *                  ..  FOR NAN (NOT-A-NUMBER)             *
  38. *                                                         *
  39. *                   SYNTAX RULES                          *
  40. *          BOTH SIGNS ARE OPTIONAL AND ARE '+' OR '-'.    *
  41. *          THE MANTISSA MUST BE PRESENT.                  *
  42. *          THE EXPONENT NEED NOT BE PRESENT.              *
  43. *          THE MANTISSA MAY LEAD WITH A DECIMAL POINT.    *
  44. *          THE MANTISSA NEED NOT HAVE A DECIMAL POINT.    *
  45. *                                                         *
  46. *      EXAMPLES:  ALL OF THESE VALUES REPRESENT THE       *
  47. *                 NUMBER ONE-HUNDRED-TWENTY.              *
  48. *                                                         *
  49. *                       120            .120E3             *
  50. *                       120.          +.120E+03           *
  51. *                      +120.          0.000120E6          *
  52. *                   0000120.00  1200000E-4                *
  53. *                               1200000.00E-0004          *
  54. *                                                         *
  55. *      FLOATING POINT RANGE:                              *
  56. *                                                         *
  57. *          NUMERIC INPUT OTHER THAN THE SPECIAL SYMBOLS   *
  58. *          FOR NAN (NOT-A-NUMBER) AND INFINITY MUST BE    *
  59. *          WITHIN THE FOLLOWING RANGES OR ZERO:           *
  60. *                                                         *
  61. *                   18                             -20    *
  62. *    9.22337177 X 10   > +NUMBER >  5.42101070 X 10       *
  63. *                                                         *
  64. *                   18                             -20    *
  65. *   -9.22337177 X 10   > -NUMBER > -2.71050535 X 10       *
  66. *                                                         *
  67. *          VALUES WHICH ARE NOT ZERO OR A SPECIAL SYMBOL  *
  68. *          AND WHOSE MAGNITUDES ARE NOT WITHIN THE ABOVE  *
  69. *          RANGES WILL BE FORCED TO SIGNED ZERO IF TOO    *
  70. *          SMALL OR A SIGNED INFINITY IF TOO LARGE.       *
  71. *                                                         *
  72. *      PRECISION:                                         *
  73. *                                                         *
  74. *          THIS CONVERSION RESULTS IN A FORMAT EQUIVALENT *
  75. *          TO IEEE SINGLE-PRECISION WITH GUARANTEED ERROR *
  76. *          LESS THAN OR EQUAL TO ONE-HALF LEAST           *
  77. *          SIGNIFICANT BIT (23.5 BITS) FOR VALUES WITHIN  *
  78. *          THE ALLOWED RANGES AS DESCRIBED ABOVE.         *
  79. *                                                         *
  80. *      NOTES:                                             *
  81. *          1) IF THE 'C' BIT IN THE CCR INDICATES AN      *
  82. *             INVALID PATTERN DETECTED, THEN A0 WILL      *
  83. *             POINT TO THE INVALID CHARACTER.             *
  84. *                                                         *
  85. ***********************************************************
  86.          PAGE
  87. IEFAFP IDNT    1,1  IEEE FORMAT EQUIVALENT ASCII TO FLOAT
  88.  
  89.          OPT       PCS
  90.  
  91.          XDEF      IEFAFP    ENTRY POINT DEFINITION
  92.  
  93.       XREF    9:FFPAFP    FAST FLOATING POINT CONVERSION ROUTINE
  94.          XREF      9:IEFTIEEE FFP CONVERSION TO IEEE FORMAT
  95.          XREF      9:IEFRTNAN INTERNAL RETURN A GENERATED NAN ROUTINE
  96.       XREF    FFPCPYRT    COPYRIGHT NOTICE
  97.  
  98.          SECTION    9
  99.  
  100. EXPMSK   EQU       $7F800000 IEEE FORMAT EXPONENT LOCATION MASK
  101. NEGZERO  EQU       $80000000 IEEE FORMAT NEGATIVE ZERO VALUE
  102.  
  103. ***************************************
  104. * ASCII TO IEEE FLOATING POINT FORMAT *
  105. ***************************************
  106. IEFAFP   MOVEM.L   D3-D7,-(SP)         SAVE CALLER'S REGISTERS
  107.          MOVE.B    (A0)+,D3  LOAD FIRST CHAR
  108. * ISOLATE NEGATIVE VALUES TO FORCE PROPER SIGN FOR ZERO
  109.          CMP.B     #'-',D3   ? BRANCH NEGATIVE - NOT SPECIAL SYMBOL
  110.          BEQ.S     IEFMINUS  BRANCH IF MINUS NUMERIC VALUE
  111. * CHECK FOR INFINITY OR NAN TYPES
  112.          LSL.W     #8,D3     SHIFT OVER A BYTE
  113.          MOVE.B    (A0)+,D3  LOAD NEXT BYTE
  114.          MOVE.L    #0,D7     ASSUME POSITIVE INFINITY
  115.          CMP.W     #'>>',D3  ? PLUS INFINITY
  116.          BEQ.S     IEFGOTI   BRANCH IF SO
  117.          CMP.W     #'<<',D3  ? MINUS INFINITY
  118.          BNE.S     IEFTRYN   NO, TRY NAN
  119.          MOVE.L    #-1,D7    SHOW NEGATIVE INFINITY
  120. * RETURN PLUS OR MINUS INFINITY
  121. IEFGOTI  LSL.L     #1,D7     SET "X" TO SIGN BIT
  122.          MOVE.L    #EXPMSK<<1,D7  SET EXPONENT BITS ALL ONES AND OVER TO LEFT
  123.          ROXR.L    #1,D7     INSERT PROPER SIGN IN
  124.          MOVEM.L   (SP)+,D3-D6 RESTORE REGISTERS
  125.          ADD.L     #4,SP     SKIP STORED D7
  126.          RTS                 RETURN TO CALLER "C" CLEARED
  127.  
  128. * NEGATIVE VALUE - DO CONVERSION AND FORCE MINUS SIGN IF ZERO
  129. IEFMINUS SUB.L     #1,A0     BACK TO START OF MINUS SIGN
  130.          BSR       FFPAFP    CONVERT REMAINDER TO FLOATING POINT
  131.          BCS.S     IEFFAIL   BRANCH IF ERROR IN CONVERSION
  132.          BNE.S     IEFGOOD   BRANCH IF GOOD AND NOT ZERO
  133.          MOVE.L    #NEGZERO,D7 RETURN NEGATIVE ZERO
  134.          MOVE.L    #0,D6     SET CONDITION CODE FOR ZERO RETURN
  135.          MOVEM.L   (SP)+,D3-D6  RESTORE ALL BUT D7
  136.          ADD.L     #4,SP     SKIP D7 ON STACK
  137.          RTS                 RETURN TO CALLER WITH SIGNED ZERO
  138.  
  139. * TRY A NAN
  140. IEFTRYN  CMP.W     #'..',D3  ? NAN HERE
  141.          BEQ       IEFRTNAN  YES, RETURN A NAN TO THE CALLER
  142. * NOT A SPECIAL CASE - CONVERT IT
  143.          SUB.L     #2,A0     BACK TO ORIGINAL POINTER POSITION
  144.          BSR       FFPAFP    CONVERT TO FAST FLOATING POINT
  145. IEFGOOD  BCC       IEFTIEEE  AND FINALLY TO IEEE FORMAT AND RETURN
  146. * CONVERSION FAILED - RETURN TO CALLER WITH "C" BIT SET IN CCR
  147. IEFFAIL  MOVEM.L   (SP)+,D3-D7         RESTORE CALLERS REGISTERS
  148.          RTS                 AND RETURN WITH "C" BIT SET IN CCR
  149.  
  150.          END
  151.  
  152.